#ifndef __RECKON__RSTRING_H__
#define __RECKON__RSTRING_H__

#include "includes.h"

namespace reckon
{
	class RStringImpl;

	class RECKON_CLASS RString
	{
	public:
		void append(LPCTSTR lpszFormat, ...);
		void appendFormat(LPCTSTR lpszFormat, ...);

	public:
		RString& operator=(wchar_t wch);
		RString& operator=(char ch);
		RString& operator=(LPCTSTR lpszStr);
		RString& operator=(std::string stdStr);
		RString& operator=(std::wstring stdWStr);
		RString& operator=(const RString& other);

		RString operator+(const RString& lhs, const RString& rhs);

		RString operator+(const RString& lhs, wchar_t wch);
		RString operator+(const RString& lhs, char ch);
		RString operator+(const RString& lhs, LPCTSTR lpszStr);
		RString operator+(const RString& lhs, std::string stdStr);
		RString operator+(const RString& lhs, std::wstring stdWStr);
		RString operator+(wchar_t wch, const RString& rhs);
		RString operator+(char ch, const RString& rhs);
		RString operator+(LPCTSTR lpszStr, const RString& rhs);
		RString operator+(std::string stdStr, const RString& rhs);
		RString operator+(std::wstring stdWStr, const RString& rhs);

		RString& operator+=(wchar_t wch);
		RString& operator+=(char ch);
		//RString& operator+=(LPCSTR lpszStr);
		RString& operator+=(LPCTSTR lpszStr);
		RString& operator+=(std::string stdStr);
		RString& operator+=(std::wstring stdWStr);
		RString& operator+=(const RString& other);

		LPCTSTR operator() const;

	public:
		RString();
		RString(LPCSTR lpszStr);
		RString(LPCWSTR lpszStr);
		RString(std::string stdStr);
		RString(std::wstring stdWStr);
		RString(const RString& other);

	public:
		virtual ~RString();




	private:
		RStringImpl* pImpl;
	};
}


#endif // __RECKON__RSTRING_H__